- •Лекция 25
- •Возможности сопроцессора
- •Архитектура сопроцессора
- •Регистры сопроцессора
- •Регистр состояния SWR
- •Регистр управления CWR
- •Регистр тегов TWR
- •Форматы данных
- •Форматы данных
- •Форматы вещественных
- •Форматы данных
- •Форматы данных
- •Форматы данных
- •Система команд сопроцессора
- •Система команд
- •Команды передачи данных
- •Команды передачи данных
- •Целочисленные арифметические команды
- •Вещественные арифметические команды
- •Вещественные арифметические команды
- •Вещественные арифметические команды
- •Вещественные арифметические команды
- •Вещественные арифметические команды
- •Команды сравнения
- •Команды сравнения
- •Команды трансцендентных функций
- •Команды трансцендентных функций
- •Команды управления сопроцессором
- •Команды управления сопроцессором
- •Команды управления сопроцессором
- •Пример 1
- •Пример 1
- •Пример 1
- •Пример 1
- •Пример 1
- •Пример 2
- •Пример 2 (данные
- •Пример 2 (ввод интервала)
- •Пример 2 (ввод K и N)
- •Пример 2 (подготовка к выводу таблицы)
- •Пример 2 (цикл вывода
Пример 1
Написать программу для вычисления значения выражения:
x2 y2 tg(x), |
x y 0 |
||
f (x y)3 |
sin(x), |
x y 0 |
|
|
|
|
|
|
3 |
cos(x), |
x y 0 |
( y x) |
|
Пример 1
include \masm32\include\masm32rt.inc
.data?
valX dq ? valY dq ? valZ dq ?
.data |
|
|
|
mess1 |
db |
'Input X: ',0 |
;Приглашение к вводу Х |
mess2 |
db |
'Input Y: ',0 |
;Приглашение к вводу У |
mess3 |
db |
'Result: ', 0 |
;Сообщение о выводе результата |
buff |
db 50 dup(0) |
;Буфер для ввода данных |
|
endl |
db |
0dh, 0ah, 0 |
;Перевод строки |
|
|
|
|
Пример 1
start:
call main inkey exit
main proc cls
invoke StdOut, ADDR mess1 invoke StdIn, ADDR buff, 50
invoke StrToFloat, ADDR buff, ADDR valX
invoke StdOut, ADDR mess2 invoke StdIn, ADDR buff, 50
invoke StrToFloat, ADDR buff, ADDR valY
fld qword ptr valX fcomp qword ptr valY fstsw ax
sahf
jz |
func1 |
jnc |
func2 |
jmp |
func3 |
func1: |
|
call |
Func01 |
jmp |
toquit |
func2: |
|
call |
Func02 |
jmp |
toquit |
func3: |
|
call |
Func03 |
toquit: |
|
fstp |
qword ptr valZ |
invoke FloatToStr, valZ, ADDR buff invoke StdOut, ADDR mess3 invoke StdOut, ADDR buff
invoke StdOut, ADDR endl ret
main endp
Пример 1
Func01 |
proc |
|
|
|
fld |
qword ptr valY |
;Заносим Y в st(0) |
|
fmul |
st(0), st |
;Вычисление Y*Y в st(0) |
|
fld |
qword ptr valX |
;Заносим X в st(0) |
|
fld |
st(0) |
;Копируем st(0) в st(1) |
|
fmul |
st(1), st |
;Вычисление X*X в st(1) |
|
fptan |
|
;Вычисление тангенса |
|
fincstp |
|
;Удаление 1 из вершины стека |
|
faddp |
st(1),st |
;Сложение st(1) и st и |
|
выталкивание st |
|
|
|
faddp |
st(1),st |
;Сложение st(1) и st и |
|
выталкивание st |
|
|
|
ret |
;Выход |
|
Func01 |
endp |
|
|
|
|
|
|
Пример 1
Func02 |
proc |
Func03 |
proc |
fld |
qword ptr valX |
fld |
qword ptr valY |
fsub |
qword ptr valY |
fsub |
qword ptr valX |
fld |
st(0) |
fld |
st(0) |
fmul |
st(1), st |
fmul |
st(1), st |
fmulp |
st(1), st |
fmulp |
st(1), st |
fld |
qword ptr valX |
fld |
qword ptr valX |
fsin |
|
fcos |
|
faddp |
st(1), st |
faddp |
st(1), st |
ret |
|
ret |
|
Func02 |
endp |
Func03 |
endp |
Пример 2
Вывести на экран таблицу значений функции:
Y=X^K
Все параметры задает пользователь:K – степень (вещественное значение);
X – вещественное значение, задается диапазоном [A;B], 0≤A<B;
N – количество строк в таблице.
Пример 2 (данные
.data? |
dq |
? |
;Левая граница интервала |
valA |
|||
программы) |
|
||
valB |
dq |
? |
;Правая граница интервала |
valK |
dq |
? |
;Степень |
valX |
dq |
? |
;Текущий аргумент функции |
valY |
dq |
? |
;Текущее значение функции |
valH |
dq |
? |
;Шаг приращения аргумента |
valN |
dd |
? |
;Количество строк в таблице |
.data |
|
|
|
mess01 |
db |
'Input A: ', 0 |
|
mess02 |
db |
'Input B: ', 0 |
|
mess03 |
db |
'Input K: ', 0 |
|
mess04 |
db |
'Input N: ', 0 |
|
tblhead |
db |
' X |
Y',0dh,0ah,'------+------',0dh,0ah,0 |
endl |
db |
0dh, 0ah, 0 |
|
delim |
db |
09h, ' | ', 09h, 0 |
|
err00 |
db |
'Incorrect A!', 0dh, 0ah, 0 |
|
err01 |
db |
'Incorrect A and B!', 0dh, 0ah, 0 |
|
err02 |
db |
'Incorrect N!', 0dh, 0ah, 0 |
|
buff |
db |
50 dup(0) |
|
|
|
|
|
Пример 2 (ввод интервала)
main proc |
|
|
|
|
|
invoke |
StdOut, ADDR mess01 |
|
|
|
invoke |
StdIn, ADDR buff, 50 |
|
|
|
invoke |
StrToFloat, ADDR buff, ADDR valA |
||
|
fldz |
|
;Загрузка нуля |
|
|
fcomp |
qword ptr valA |
;Сравнение с A |
|
|
fstsw |
ax |
;Сохранение слова состояния FPU |
|
|
sahf |
|
;Запись состояния в регистр флагов |
|
|
jna |
next00 |
;Переход, если 0<A |
|
|
invoke |
StdOut, ADDR err00 |
;Вывод сообщения об ошибке |
|
|
ret |
|
;Завершение main |
|
next00: |
|
|
|
|
|
invoke |
StdOut, ADDR mess02 |
|
|
|
invoke |
StdIn, ADDR buff, 50 |
|
|
|
invoke |
StrToFloat, ADDR buff, ADDR valB |
||
|
fld |
qword ptr valB |
;Загрузка B |
|
|
fcom |
qword ptr valA |
;Сравнение с A |
|
|
fstsw |
ax |
;Сохранение слова состояния FPU |
|
|
sahf |
|
;Запись состояния в регистр флагов |
|
|
ja |
next01 |
;Переход, если A<B |
|
|
invoke |
StdOut, ADDR err01 |
;Вывод сообщения об ошибке |
|
|
ret |
|
;Завершение main |
|
|
|
|
|
|
Пример 2 (ввод K и N)
next01: |
|
|
invoke |
StdOut, ADDR mess03 |
|
invoke |
StdIn, ADDR buff, 50 |
|
invoke |
StrToFloat, ADDR buff, ADDR valK |
|
invoke |
StdOut, ADDR mess04 |
|
invoke |
StdIn, ADDR buff, 50 |
|
invoke |
atol, ADDR buff |
|
cmp |
eax, 0 |
;Проверка N>0 |
jg |
next02 |
|
invoke |
StdOut, ADDR err02 |
|
ret |
|
|
Пример 2 (подготовка к выводу таблицы)
next02: |
|
|
|
|
|
|
mov |
dword ptr valN, eax |
|
|
|
|
fsub |
qword ptr valA |
;Вычисление B - A |
||
|
fild |
dword ptr valN |
;Загрузка количества строк |
||
|
fld1 |
|
;Загрузка единицы |
||
|
fsubp |
st(1), st |
;Вычисление N - 1 |
||
|
fdivp |
st(1), st |
;Вычисление (B-A)/(N-1) |
||
|
fstp |
qword ptr valH |
;Сохранение шага |
||
|
mov |
eax, dword ptr valA |
;Инициализация X |
||
|
mov |
dword ptr valX, eax |
|
|
|
|
mov |
eax, dword ptr valA + 4 |
|
|
|
|
mov |
dword ptr valX + 4, eax |
|
|
|
|
invoke |
StdOut, ADDR tblhead |
;Вывод заголовка |
||
таблицы |
|
|
|
|
|
|
mov |
ecx, dword ptr valN |
;Установка количества |
||
|
|
|
|
;итераций |
|
|
|
|
|
|
|